1) 교점 찾기, 내분점/외분점, 기하 Primitives
Mathit에서는 일일이 수학 공식을 사용하여 점의 위치를 계산할 필요가 없습니다. 솔브엔진과 기본 도형 함수를 활용하면 선분, 곡선, 원 간의 교점이나 비율에 따른 점의 위치를 한 줄로 선언하고 즉시 활용할 수 있습니다.
이번 문서에서는 교점 구하기, 내분점/외분점 및 투영점, 그리고 기하 매크로 함수에 대해 알아보겠습니다.
1. 교점 찾기
isect() 함수는 직선, 선분, 원, 함수 곡선 간의 교점(Intersection)을 자동으로 산출합니다.
1-1. 기본 사용법
두 기하 객체를 인자로 전달하면 교점 좌표를 반환합니다.
L1 = line(A--B)
L2 = line(C--D)
// 두 직선 L1과 L2의 교점 P 구하기
P = isect(L1, L2)
1-2. 교점이 여러 개인 경우
원과 원, 원과 직선, 또는 함수 곡선처럼 교점이 2개 이상 발생하는 경우, 순서/방향 태그(#)를 붙여 원하는 교점을 정확히 선택합니다.
방향 태그에는 #top, #bottom, #left, #right, #ne, #sw 등이 있습니다.
인덱스 태그에는 #1, #2 (선분 진행 방향 또는 $x$축 좌표 순서) 등이 있습니다.
C1 = circle(center=(0,0), r=3)
C2 = circle(center=(2,0), r=3)
// 두 원의 교점 중 위쪽 교점과 아래쪽 교점 선택
P_top = isect(C1, C2, #top)
P_bottom = isect(C1, C2, #bottom)
// 첫 번째 교점 선택
P1 = isect(C1, C2, #1)
2. 내분점, 외분점 기하학적인 비율 계산
선분 위의 점이나 연장선 상의 점을 비율에 따라 쉽게 생성할 수 있습니다.
2-1. 내분점 / 외분점
두 점 $A$, $B$를 $m:n$으로 내분하거나 $t \in [0, 1]$ 비율 상의 위치를 찾습니다.
A = (0, 0)
B = (6, 0)
// A와 B를 1:2로 내분하는 점 M (m:n 내분)
M = section(A, B, 1, 2)
// 경로 A--B 상의 t 비율(0.5 = 중점) 위치의 점
Mid = on(A--B, 0.5)
// 외분점 (비율 또는 음수/1 초과 t 값 사용)
E = section_ext(A, B, 3, 1) // 3:1 외분점
2-2. 수선의 발과 투영점
한 점에서 특정 직선이나 선분에 내린 수선의 발 좌표를 계산합니다.
P = (2, 4)
L = line(A--B)
// 점 P에서 직선 L에 내린 수선의 발 H
H = proj(P, L)
// A, B, H를 이어 수선 표시
line: P--H, stroke=dash
right_ang: P--H--B, size=6pt
3. 기하 Primitives 매크로 함수
Mathit은 도형을 정의하고 구성하는 데 필요한 다양한 기본 기하 매크로 함수를 탑재하고 있습니다.
3-1. 평행선 및 수직선
parallel_line, perpendicular_line 로 사용합니다.
// 점 P를 지나고 직선 L과 평행한 직선
L_para = parallel_line(P, L)
// 점 P를 지나고 직선 L과 수직인 직선
L_perp = perpendicular_line(P, L)
3-2. 접선 및 접점
tangent_line, tangent_points 가 있습니다.
// 원 C 위에 한 점 P에서의 접선
L_tan = tangent_line(C, P)
// 원 밖의 한 점 Q에서 원 C에 그은 두 접선의 접점들
pts = tangent_points(C, Q)
T1 = pts[0]
T2 = pts[1]
3-3. 각의 이등분선
angle_bisector 를 사용합니다.
// 세 점 A, B, C가 이루는 각 ABC의 이등분선
L_bisect = angle_bisector(A, B, C)
5. 전체적으로 본다면
// 원과 원 밖의 점 정의
C = circle(center=(0,0), r=2.5)
P = (5, 1)
// 외부점 P에서 원 C에 그은 접점 구하기
t_pts = tangent_points(C, P)
T1 = t_pts[0]
T2 = t_pts[1]
// 접선 및 원 그리기
circle: C, stroke=1.5pt
line: P--T1, color=#blue
line: P--T2, color=#blue
// 중심 O에서 접점 T1에 내린 반지름 및 직각 표시
O = (0,0)
line: O--T1, stroke=dash
right_ang: O--T1--P, size=8pt
// 점 및 라벨
dot: O"O"(sw), P"P"(e), T1"$T_1$"(nw), T2"$T_2$"(sw)
여기까지 해도 Mathit의 모든 장점을 사용하는 것이 아니라 생각합니다. Mathit의 장점은 솔브엔진의 존재에 있습니다. 조건 방정식만 나열하면 위치를 제약 조건 기반으로 자동 계산해 주는 Mathit의 정수, solve { ... } 블록에 대해 다음 문서에서 알아봅시다.